from fastapi import Request
from starlette.middleware.base import BaseHTTPMiddleware, RequestResponseEndpoint

from app.constants import SAME_TOKEN
from app.core.log import logger
from app.utils import context
from app.utils.same_token import check_same_token


class SameTokenMiddleware(BaseHTTPMiddleware):
    """
    SameToken校验 中间件

    用于校验请求头中的Same-Token，用于微服务子服务外网隔离。
    """

    async def dispatch(self, request: Request, call_next: RequestResponseEndpoint):
        """
        中间件主入口函数，处理每个 HTTP 请求的 Same-Token 校验逻辑

        :param request: FastAPI 的 Request 对象，包含客户端请求信息
        :param call_next: 下一个中间件或路由处理函数
        :return: 返回处理后的响应结果
        """
        logger.debug("----------> 1. SameToken校验 中间件")

        # 1.从请求头中获取same-token值
        token = request.headers.get(SAME_TOKEN)

        # 2.校验same-token
        await check_same_token(token)
        context.set_same_token(token)

        # 3.继续执行下一个中间件
        response = await call_next(request)

        logger.debug("<---------- 1. SameToken校验 中间件")
        return response
